//package com.crm.jdy.common.utils.clearfield;
//
//import cn.hutool.core.io.resource.ResourceUtil;
//import com.fasterxml.jackson.databind.ser.FilterProvider;
//import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
//import com.fasterxml.jackson.core.JsonGenerator;
//import com.fasterxml.jackson.databind.SerializerProvider;
//import com.fasterxml.jackson.databind.ser.BeanPropertyFilter;
//import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
//import java.util.*;
//
//public class JacksonJsonFilter extends FilterProvider {
//
//    // 只返回某些字段Map
//    Map<Class<?>, Set<String>> includeMap = new HashMap<>();
//    // 过滤掉某些字段Map
//    Map<Class<?>, Set<String>> filterMap = new HashMap<>();
//    // 在某些字段返回时添加绝对路径
//    Map<Class<?>, Set<String>> baseUrlMap = new HashMap<>();
//
//    // 只返回某些字段
//    public void include(Class<?> type, String[] fields) {
//        addToMap(includeMap, type, fields);
//
//    }
//
//    // 过滤掉某些字段
//
//    public void filter(Class<?> type, String[] fields) {
//        addToMap(filterMap, type, fields);
//
//    }
//
//    // 添加某些字段的绝对路径(注意这里的方法名必须和JSON中的方法名一样)
//    public void baseUrl(Class<?> type, String[] fields) {
//        addBaseUrlToMap(baseUrlMap, type, fields);
//    }
//
//    private void addToMap(Map<Class<?>, Set<String>> map, Class<?> type, String[] fields) {
//        Set<String> fieldSet = map.get(type);
//        if (null == fieldSet || !map.containsValue(fieldSet)) {
//            fieldSet = new HashSet<>();
//        }
//        fieldSet.addAll(Arrays.asList(fields));
//        map.put(type, fieldSet);
//    }
//
//    private void addBaseUrlToMap(Map<Class<?>, Set<String>> map, Class<?> type, String[] fields) {
//        String address = ResourceUtil.getConfigByName("address");
//        Set<String> fieldSet = map.get(type);
//        if (null == fieldSet || !map.containsValue(fieldSet)) {
//            fieldSet = new HashSet<>();
//        }
//        List<String> list = Arrays.asList(fields);
//        List<String> fieldsList = new ArrayList<String>();
//        for (String field : list) {
//            field = address + field;
//            fieldsList.add(field);
//        }
//
//        fieldSet.addAll(fieldsList);
//        map.put(type, fieldSet);
//    }
//
//    @Override
//    public BeanPropertyFilter findFilter(Object arg0) {
//        // TODO Auto-generated method stub
//        return null;
//    }
//
//    @Override
//    public com.fasterxml.jackson.databind.ser.PropertyFilter findPropertyFilter(Object fieldId, Object valueToFilter) {
//
//        return new SimpleBeanPropertyFilter() {
//            @Override
//            public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider prov,
//                                         BeanPropertyWriter writer) throws Exception {
//                if (apply(pojo.getClass(), writer.getName())) {
//                    writer.serializeAsField(pojo, jgen, prov);
//                } else if (jgen.canOmitFields()) {
//                    writer.serializeAsField(pojo, jgen, prov);
//
//                }
//            }
//        };
//
//    }
//
//    public boolean apply(Class<?> type, String name) {
//        String address = ResourceUtil.getConfigByName("address");
//        Set<String> includeFields = includeMap.get(type);
//        Set<String> filterFields = filterMap.get(type);
//        Set<String> baseUrlFields = baseUrlMap.get(type);
//        // 如果过滤字段不是null，并且传过来的那个参数在includefields的Set集合里面则返回true，则把name里的所有字段全部返回，其余的不返回
//        if (includeFields != null && includeFields.contains(name)) {
//            return true;
//            // 如果过滤的filterFields不是null并且filterFields的set集合中不包含name属性返回true，如果判断之后为true，则把name全给过滤掉，不传给前端，
//        } else if (filterFields != null && !filterFields.contains(name)) {
//            return true;
//            // 如果baseUrlFileds不是null，并且传过来的那个参数在baseUrlFieds的Set集合里面则返回true，则把name里的所有字段全部返回，其余的不返回，
//        } else if (baseUrlFields != null && baseUrlFields.contains(address + name)) {
//            return true;
//
//        } else if (includeFields == null && filterFields == null && baseUrlFields == null) {
//            return true;
//        }
//        return false;
//    }
//}